package com.spring.nio.util;

import com.spring.nio.common.BasicConstant;
import com.spring.nio.common.EPlatform;
import com.spring.nio.common.OSinfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.time.LocalDateTime;

/**
 * @Auther: YSFY
 * @Date: 2019/12/1 18:06
 * @Pacage_name: com.dh.spring.client
 * @Project_Name: arthas-client
 * @Description: 客户端本地文件系统类
 */
public class LocalFileSystem {
    private static final Logger logger = LoggerFactory.getLogger(LocalFileSystem.class);
    private String filePath;
    private long diskSize;
    private String data;
    private boolean flag;

    public String getFilePath() {
        return filePath;
    }

    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }

    public long getDiskSize() {
        return diskSize;
    }

    public void setDiskSize(long diskSize) {
        this.diskSize = diskSize;
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    //TODO 验证文件路径是否合法,合法且存在则直接使用，否则创建相应的文件夹  以及返回磁盘大小是否充足  仅支持windows和linux和macOS X, 根据系统类型统一设置文件上传和下载路径
    public static LocalFileSystem checkFileSystem(String filePath) {
        LocalFileSystem localFileSystem = new LocalFileSystem();
        localFileSystem.setDiskSize(0l);
        localFileSystem.setFilePath(filePath);
        localFileSystem.setData(BasicConstant.DATA_EMPTY);
        localFileSystem.setFlag(true);

        //TODO 得到文件系统
        File[] files = File.listRoots();
        if(null != files) {
            logger.info("[" + LocalTime.formatDate(LocalDateTime.now()) + "] ----------- 验证路径合法性 -----------");
            //TODO windows系统
            if(OSinfo.getOSname().toString().equals(EPlatform.Windows.toString())) {
                //TODO 判断上传路径是否以 '\\' 为结尾
                if(!localFileSystem.getFilePath().endsWith("\\")) {
                    localFileSystem.setFilePath(localFileSystem.getFilePath() + "\\");
                }
                checkPath(localFileSystem);
            }

            //TODO linux系统或MACOSX系统
            if(OSinfo.getOSname().toString().equals(EPlatform.Linux.toString()) || OSinfo.getOSname().toString().equals(EPlatform.Mac_OS_X.toString())) {
                //TODO linux 或是 MacOS X系统根目录都是以"/"开头,如果上传路径开头没有"/"则进行追加
                if(!localFileSystem.getFilePath().startsWith("/")) {
                    localFileSystem.setFilePath("/" + localFileSystem.getFilePath());
                }

                //TODO linux 或是 MacOS X系统根目录不是以"/"结尾,则追加
                if(!localFileSystem.getFilePath().endsWith("/")) {
                    localFileSystem.setFilePath(localFileSystem.getFilePath() + "/");
                }

                //TODO 判断上传路径, 不存在的目录创建即可
                checkPath(localFileSystem);
            }

            logger.info("[" + LocalTime.formatDate(LocalDateTime.now()) + "] ----------- 检测磁盘大小 -----------");
            for(File file : files) {
                //TODO 如果是文件，则continue
                if(file.isFile()) {
                    continue;
                }

                //TODO 如果是目录，继续遍历
                if(file.isDirectory() && filePath.contains(file.getPath())) {
                    recursion(file, localFileSystem);
                    break;
                }
            }
        }

        return localFileSystem;
    }

    //TODO 判断上传路径, 不存在的目录创建即可
    private static LocalFileSystem checkPath(LocalFileSystem localFileSystem) {
        File file = new File(localFileSystem.getFilePath());
        if(!file.exists()) {
            try {
                file.mkdirs();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return localFileSystem;
    }

    //TODO 递归遍历找到文件上传目录大小
    private static LocalFileSystem recursion(File file, LocalFileSystem localFileSystem) {
        File[] f = file.listFiles();
        for(File fi : f) {
            //TODO 如果是文件，则continue
            if(fi.isFile()) {
                continue;
            }

            //TODO 如果是目录，继续遍历
            if(fi.isDirectory() && localFileSystem.getFilePath().contains(fi.getPath())) {
                if(localFileSystem.getFilePath().endsWith(fi.getName())) {
                    localFileSystem.setDiskSize(fi.getFreeSpace());
                    logger.info("[" + LocalTime.formatDate(LocalDateTime.now()) + "] ----------- 路径：path = " + localFileSystem.getFilePath() + ", 剩余磁盘空间大小：" + localFileSystem.getDiskSize() + " -----------");
                    break;
                }
                return recursion(fi, localFileSystem);
            }
        }

        return localFileSystem;
    }
}
